tools: use sysfs interface to balloon driver if present
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 17 Nov 2008 15:54:31 +0000 (15:54 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 17 Nov 2008 15:54:31 +0000 (15:54 +0000)
The pvops dom0 kernel does not expose the balloon driver via
/proc/xen, so use the sysfs interface.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
tools/python/xen/xend/osdep.py

index a026c85277fa54ce2d910ec6bfd92d9a210e8c6f..6636797b44e3c93a6fe230ae83b944911c64cc5a 100644 (file)
@@ -38,7 +38,10 @@ _vif_script = {
     "SunOS": "vif-vnic"
 }
 
-def _linux_balloon_stat(label):
+PROC_XEN_BALLOON = '/proc/xen/balloon'
+SYSFS_XEN_MEMORY = '/sys/devices/system/xen_memory/xen_memory0'
+
+def _linux_balloon_stat_proc(label):
     """Returns the value for the named label, or None if an error occurs."""
 
     xend2linux_labels = { 'current'      : 'Current allocation',
@@ -47,7 +50,6 @@ def _linux_balloon_stat(label):
                           'high-balloon' : 'High-mem balloon',
                           'limit'        : 'Xen hard limit' }
 
-    PROC_XEN_BALLOON = '/proc/xen/balloon'
     f = file(PROC_XEN_BALLOON, 'r')
     try:
         for line in f:
@@ -62,6 +64,29 @@ def _linux_balloon_stat(label):
     finally:
         f.close()
 
+def _linux_balloon_stat_sysfs(label):
+    sysfiles = { 'target'       : 'target_kb',
+                 'current'      : 'info/current_kb',
+                 'low-balloon'  : 'info/low_kb',
+                 'high-balloon' : 'info/high_kb',
+                 'limit'        : 'info/hard_limit_kb' }
+
+    name = os.path.join(SYSFS_XEN_MEMORY, sysfiles[label])
+    f = file(name, 'r')
+
+    val = f.read().strip()
+    if val.isdigit():
+        return int(val)
+    return None
+
+def _linux_balloon_stat(label):
+       if os.access(PROC_XEN_BALLOON, os.F_OK):
+               return _linux_balloon_stat_proc(label)
+       elif os.access(SYSFS_XEN_MEMORY, os.F_OK):
+               return _linux_balloon_stat_sysfs(label)
+
+       return None
+
 def _solaris_balloon_stat(label):
     """Returns the value for the named label, or None if an error occurs."""